Aller au contenu principal

SDK Web

Ajoutez AR Clip VPS à votre propre page web. Le SDK Web trouve, directement dans le navigateur, où se trouve le visiteur sur vos cartes VPS, sans aucune application à installer.

Avant de commencer​

  • Une clé d'API. Pour en obtenir une, écrivez-nous via le Support.
  • Les identifiants de lieu de vos cartes. Chaque carte en a un : voir l'Introduction.
  • Une page servie en HTTPS. Les navigateurs ne donnent accès à la caméra et aux capteurs de mouvement qu'aux pages sécurisées. localhost compte comme sécurisé.

Installation​

npm install @web-ar-studio/webar-engine-sdk

Le package est sur npm et inclut ses types TypeScript.

Lancer le VPS​

Le VPS tourne dans une session de suivi du monde. Ajoutez vps à init() et indiquez-y vos identifiants de lieu. Le SDK ne dessine rien lui-même : affichez la scène avec le moteur de votre choix, que ce soit three.js, Babylon.js, PlayCanvas ou du WebGL pur.

import * as THREE from "three";
import WAS, {
PROJECT_MODE_SLAM,
TRIGGER_MODE_SLAM,
CAMERA_MODE_ENVIRONMENT,
PROVIDER_8THWALL,
EVENT_FRAME,
EVENT_VPS_READY,
EVENT_VPS_LOCALIZED,
EVENT_VPS_NOT_LOCALIZED,
EVENT_VPS_ERROR,
} from "@web-ar-studio/webar-engine-sdk";

const was = new WAS();

const { canvas, context } = await was.init({
apiKey: "your-api-key",
mode: PROJECT_MODE_SLAM,
cameraMode: CAMERA_MODE_ENVIRONMENT,
container: document.querySelector("#ar"),
triggers: [{ id: 1, mode: TRIGGER_MODE_SLAM, source: null }],
vps: { locationIds: ["your-location-id"] },
});

const renderer = new THREE.WebGLRenderer({ canvas, context });

was.on(EVENT_VPS_READY, () => console.log("VPS started"));
was.on(EVENT_VPS_LOCALIZED, ({ locationId, offset }) => {
console.log("Found the place on map", locationId, offset);
});
was.on(EVENT_VPS_NOT_LOCALIZED, ({ status, statusDescription }) => {
console.log("Not found yet:", status, statusDescription);
});
was.on(EVENT_VPS_ERROR, (message) => console.warn("VPS error:", message));

// Le suivi et le VPS démarrent avec le callback d'image. Enregistrez-le sur un appui :
// WebXR et les capteurs de mouvement de l'iPhone exigent un geste de l'utilisateur.
startButton.onclick = () =>
was.on(EVENT_FRAME, () => renderer.render(scene, camera));

Sans locationIds, le VPS localise de façon globale, sans viser une carte précise. C'est plus long : augmentez requestTimeoutMs.

Passez vps à init()

Dans Chrome sur Android, l'accès à la caméra pour le VPS n'est accordé qu'au démarrage de la session. Si vous démarrez sans vps, vous ne pourrez plus activer le VPS dans cette session : setupVPS() lève VpsError.

Où ça fonctionne​

Le SDK choisit un moteur de suivi (provider) sur l'appareil. Avec la valeur par défaut "auto", il essaie d'abord webxr, puis 8thwall.

MoteurOùVPS
webxrChrome sur AndroidOui. Le SDK place lui-même la scène sur la carte.
8thwallNavigateurs sans WebXR, comme Safari sur iPhoneOui. Vous appliquez offset vous-même.
arclip-webarSeulement si vous le choisissezNon

Placer le contenu sur la carte​

Placez votre contenu dans les coordonnées de votre carte VPS. Quand le VPS trouve le lieu, EVENT_VPS_LOCALIZED fournit offset : le déplacement qui fait passer le monde du suivi sur la carte.

  • Sur webxr, le SDK a déjà appliqué offset, en douceur : le contenu de la carte apparaît à sa place.
  • Sur 8thwall, le SDK se contente de transmettre offset. Regroupez le contenu de la carte dans un groupe et donnez-lui l'inverse de offset à chaque localisation :
const mapRoot = new THREE.Group(); // tout ce qui est placé en coordonnées de carte
scene.add(mapRoot);

was.on(EVENT_VPS_LOCALIZED, ({ offset }) => {
if (was.getActiveProviderId() !== PROVIDER_8THWALL) return; // webxr l'applique lui-même
const { position: p, orientation: q } = offset;
new THREE.Matrix4()
.compose(
new THREE.Vector3(p.x, p.y, p.z),
new THREE.Quaternion(q.x, q.y, q.z, q.w),
new THREE.Vector3(1, 1, 1),
)
.invert()
.decompose(mapRoot.position, mapRoot.quaternion, mapRoot.scale);
});

Le SDK n'accepte un résultat que si la correspondance est assez fiable et si le saut depuis le résultat précédent est faisable à pied. Tout le reste arrive comme EVENT_VPS_NOT_LOCALIZED. Ainsi, le contenu ne saute pas dans les lieux qui se ressemblent, comme les longs couloirs.

Événements​

ÉvénementCe que vous recevez
EVENT_VPS_READYRien. Le VPS a démarré.
EVENT_VPS_LOCALIZEDlocationId, offset (position, orientation), trackingPosition, trackingRotation, vpsPosition, vpsRotation, timestamp
EVENT_VPS_NOT_LOCALIZEDstatus, statusDescription, failCount
EVENT_VPS_ERRORUn message d'erreur, sous forme de chaîne

Piloter le VPS​

MéthodeCe qu'elle fait
startVPS(), stopVPS()Reprend ou met en pause la localisation
isVPSActive()Indique si le VPS tourne
setVPSLocationIds(ids)Passe à d'autres cartes ; une liste vide localise de façon globale
setupVPS(config)Change les réglages du VPS pendant une session
updateVPSSession()Démarre une nouvelle session VPS : les résultats précédents n'influencent plus les nouveaux
resetTracking()Annule la correction VPS et repart de zéro, par exemple après un mauvais résultat

Réglages​

Tous les champs de vps sont facultatifs. Le SDK reprend apiKey depuis init(), inutile de le répéter.

ChampPar défautCe qu'il fait
locationIdsaucunLes cartes comparées à l'image de la caméra. Sans lui, le VPS localise de façon globale.
captureInterval2500Délai entre deux requêtes de localisation, en ms
requestTimeoutMs20000Durée d'attente d'une réponse, en ms
maxFailsCount5Nombre d'échecs d'affilée avant que le SDK démarre une nouvelle session VPS
imageFormat"jpeg""jpeg" ou "webp". N'utilisez WebP qu'avec un serveur qui sait le lire. Si le navigateur ne sait pas encoder le WebP, le SDK envoie du JPEG.
jpegQuality1Qualité de l'image, de 0 à 1
targetWidth, targetHeight540, 960Taille de l'image envoyée au serveur
minInlierRatio, minNumInliers0.6, 600Le niveau de fiabilité qu'une correspondance doit atteindre pour être retenue
maxJumpBaseMeters, maxJumpSpeedMps3, 2Jusqu'où un nouveau résultat peut s'éloigner du précédent : maxJumpBaseMeters plus maxJumpSpeedMps par seconde écoulée depuis le dernier résultat
serverUrlAR Clip VPSUn autre serveur VPS
sendApiKeyHeadertrueEnvoie la clé dans l'en-tête x-vps-apikey. Ne le désactivez que pour votre propre serveur, s'il n'accepte pas cet en-tête.

Erreurs​

Si le VPS ne peut pas tourner dans cette session, init() ou une méthode VPS échoue avec une erreur nommée VpsError (constante VPS_ERROR). Les erreurs après le démarrage, comme une requête qui échoue, arrivent dans EVENT_VPS_ERROR.

Pour aller plus loin​

  • Le README du package décrit les autres modes de suivi, les ancres et la configuration complète avec three.js.
  • Pour mettre en place le VPS sans code, utilisez les Scènes VPS dans AR Clip Studio.

Suite : Appareils compatibles — téléphones, navigateurs et casques.